package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;

import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.dominio.common.helper.SelectOneMenuHelper;
import pe.com.cotelasa.scp.controlador.backingBean.BKServicio;
import pe.com.cotelasa.scp.controlador.comando.ComandoActualizar;
import pe.com.cotelasa.scp.controlador.comando.ComandoGuardar;
import pe.com.cotelasa.scp.controlador.comando.IComando;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.service.IServicioCategoriaArticulo;
import pe.com.cotelasa.scp.dominio.service.IServicioServicio;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.entidad.CategoriaArticulo;
import pe.com.cotelasa.scp.entidad.ProveedorServicio;
import pe.com.cotelasa.scp.entidad.Servicio;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

/**
 * @author usuario
 */
@Named(value = "MBServicio")
@Scope("request")
public class MBServicio extends MBGenerico implements IMantenedor, Serializable {

    private static final long serialVersionUID = -3008828663507135743L;
    private static Logger logger = Logger.getLogger(MBServicio.class);
    @Inject
    private BKServicio bkServicio;
    @Inject
    private IServicioCategoriaArticulo servicioCategoriaArticulo;
    @Inject
    private IServicioServicio servicioServicio;
    
    private String URL;
    
    @Autowired
    BKSession session;

    public MBServicio() {
    }

    public void buscarListaServicios() {
        Servicio objServicio = new Servicio();
        objServicio.setNombre(bkServicio.getServicioBusqueda().getNombre());

        try {
            objServicio.setIdCategoriaArticulo(bkServicio.getIdCategoriaArticuloBusqueda());
            bkServicio.setListaServiciosActivos(this.servicioServicio.listarServiciosPorFiltro(objServicio));
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public String nuevo() {
        this.bkServicio.setComando(new ComandoGuardar(this));
        
        //limpiarBusqueda();
        bkServicio.setServicioFormulario(new Servicio());
        bkServicio.setIdCategoriaArticuloFormulario(new CategoriaArticulo());
        cargarCombo();
        return URLPaginacion.Servicio.URL_FORMULARIO_SERVICIO;
    }

    public String editar() {
        this.bkServicio.setComando(new ComandoActualizar(this));
        bkServicio.setServicioModificar(bkServicio.getServicioFormulario().getNombre());
        bkServicio.setIdCategoriaArticuloFormulario(bkServicio.getServicioFormulario().getIdCategoriaArticulo());
        //limpiarBusqueda();
        return URLPaginacion.Servicio.URL_FORMULARIO_SERVICIO;
    }

    public String guardar() {
        Servicio servicio = bkServicio.getServicioFormulario();
        servicio.setUsrCreacion(session.getUsuario().getUsuario());
        servicio.setFecCreacion(new Date());
        try {
            if (servicioServicio.validarServicio(servicio)) {
                servicio.setIdCategoriaArticulo(bkServicio.getIdCategoriaArticuloFormulario());
                servicioServicio.guardarServicio(servicio);
                mostrarMensaje("Se guardo el Servicio satisfactoriamente.");
                //URL = mostrarMantenimiento();
                buscarListaServicios();
                URL = URLPaginacion.Servicio.URL_LISTA_SERVICIO;
            } else {
                mostrarError("Ya existe un Servicio con este nombre");
                URL = URLPaginacion.Servicio.URL_FORMULARIO_SERVICIO;                
            }
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al guardar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            URL = URLPaginacion.Servicio.URL_FORMULARIO_SERVICIO; 
        }
        return URL;
    }

    public String actualizar() {
        Servicio servicio = bkServicio.getServicioFormulario();
        servicio.setUsrModificacion(session.getUsuario().getUsuario());
        servicio.setFecModificacion(new Date());

        try {
            boolean band = true;
            if (!bkServicio.getServicioModificar().equals(bkServicio.getServicioFormulario().getNombre())) {
                band = servicioServicio.validarServicio(bkServicio.getServicioFormulario());
            }
                
            if (band) {
                servicio.setIdCategoriaArticulo(bkServicio.getIdCategoriaArticuloFormulario());
                servicioServicio.actualizarServicio(servicio);
                mostrarMensaje("Se actualizo los datos del Servicio satisfactoriamente.");
                //URL = mostrarMantenimiento();
                buscarListaServicios();
                URL = URLPaginacion.Servicio.URL_LISTA_SERVICIO;
            } else {
                mostrarError("Ya existe un Servicio con este nombre");
                URL = URLPaginacion.Servicio.URL_FORMULARIO_SERVICIO;
            }
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return URL;
    }

    public String mostrarMantenimiento() {

        limpiarBusqueda();
        bkServicio.setListaServiciosActivos(null);
        cargarCombo();

        return URLPaginacion.Servicio.URL_LISTA_SERVICIO;
    }

    public void eliminar(ActionEvent actionEvent) {
        logger.info("Preparando para eliminar servicio");
        
        try {
            
            Servicio servicio = servicioServicio.conseguirServicioPorId(bkServicio.getServicioSeleccionado().getId());
            servicio.setEstadoRegistro(ESTADO_REGISTRO.INACTIVO.getValor());
            servicio.setUsrModificacion(session.getUsuario().getUsuario());
            servicio.setFecModificacion(new Date());
            
            for(ProveedorServicio prove:servicio.getProveedorServicioCollection()){
                if(prove.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()){
                    System.out.println("proveedor en donde esta; "+prove.getProveedor().getRazonSocial());
                    System.out.println("servicio en donde esta; "+prove.getServicio());
                    prove.setEstadoRegistro(ESTADO_REGISTRO.INACTIVO.getValor());
                    prove.setUsrModificacion(session.getUsuario().getUsuario());
                    prove.setFecModificacion(new Date());
                }
                
            }
            
            //servicioServicio.actualizarServicio(servicio);
            bkServicio.setListaServiciosActivos(servicioServicio.listarServiciosPorFiltro(bkServicio.getServicioBusqueda()));
            mostrarMensaje("Se elimino el Servicio satisfactoriamente");
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al eliminar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public String aceptar() {
        try {
            servicioServicio.actualizarServicio(bkServicio.getServicioFormulario());
            bkServicio.setServicioFormulario(servicioServicio.conseguirServicioPorId(1));
            bkServicio.setListaServiciosActivos(servicioServicio.listarServiciosActivos());
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return URLPaginacion.Servicio.URL_LISTA_SERVICIO;
    }


    private void cargarCombo() {

        try {
            bkServicio.setListaCategoriaArticulo(servicioCategoriaArticulo.listarCategoriasArticulosActivos());
        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }
    }

    private void limpiarBusqueda() {
        bkServicio.setServicioBusqueda(new Servicio());
        bkServicio.setIdCategoriaArticuloBusqueda(new CategoriaArticulo());
    }

    @Override
    public String retroceder() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String cancelar() {
        //return mostrarMantenimiento();
        return URLPaginacion.Servicio.URL_LISTA_SERVICIO;
    }

    @Override
    public String ver() {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
